package com.penghaisoft.microwms.materialhand.web.insidewarehouse.controller;

import java.util.List;
import java.util.concurrent.TimeUnit;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.penghaisoft.microwms.common.Constant;
import com.penghaisoft.microwms.common.dto.HandResp;
import com.penghaisoft.microwms.common.dto.RawContractChangePlanDto;
import com.penghaisoft.microwms.common.dto.TransResult;
import com.penghaisoft.microwms.common.wms.model.RawContractChangePlan;
import com.penghaisoft.microwms.materialhand.web.insidewarehouse.service.IMaterialHandInsideWhService;

import lombok.extern.slf4j.Slf4j;

/** 
 * @Package com.penghaisoft.microwms.materialhand.web.insidewarehouse.controller
 * @ClassName: RawContractChangeController
 * @Description: 原材料合同变更
 * @author luoteng
 * @date 2019年3月7日 上午11:17:22
 */
@RestController
@RequestMapping(value = "contract/change")
@Slf4j
public class RawContractChangeController {

    @Autowired
    private IMaterialHandInsideWhService iMaterialHandInsideWhService;
    
    @Resource
	private StringRedisTemplate stringRedisTemplate;//注入对象
    
    /**
     * @Title: queryOrderByCode
     * @Description: 提单
     * @date 2019年3月7日 上午10:57:35
     * @author luoteng
     * @param rawContractChangePlanDto
     * @return HandResp   
     */
    @PostMapping("queryOrder")
    public HandResp queryOrderByCode(@RequestBody RawContractChangePlanDto rawContractChangePlanDto) {
        HandResp resp = new HandResp();
        resp.setCode(Constant.SUCCESS);
        
        RawContractChangePlan rawContractChangePlan = new RawContractChangePlan();
        rawContractChangePlan.setActiveFlag("1");
        rawContractChangePlan.setContractChangePlanNo(rawContractChangePlanDto.getContractChangePlanNo());
        
        List<RawContractChangePlan> list = iMaterialHandInsideWhService.queryPlanList(rawContractChangePlan);
        if (list.size() > 0) {
//        	状态：0：创建 1：通过 2：驳回 3：扫码中 4：扫码完成 5：确认完成
            for (RawContractChangePlan tmp : list) {
                if ("0".equals(tmp.getStatus())) {
                	resp.setCode(Constant.FAIL);
                    resp.setMsg("该变更单未审核！");
                    return resp;
                }else if ("2".equals(tmp.getStatus())) {
                	resp.setCode(Constant.FAIL);
                    resp.setMsg("该变更单被驳回！");
                    return resp;
                }else if ("5".equals(tmp.getStatus())) {
                	resp.setCode(Constant.FAIL);
                    resp.setMsg("该变更单已经确认完成！");
                    return resp;
                }
            }
        } else {
            resp.setCode(Constant.FAIL);
            resp.setMsg("该变更单不存在！");
            return resp;
        }
        
        return resp;
    }
    
    /**
     * @Title: info
     * @Description: 详情
     * @date 2019年3月7日 上午10:59:36
     * @author luoteng
     * @param rawContractChangePlanDto
     * @return HandResp   
     */
    @PostMapping("info")
    public HandResp info(@RequestBody RawContractChangePlanDto rawContractChangePlanDto) {
    	HandResp resp = new HandResp();
    	resp.setCode(Constant.SUCCESS);
    	
        RawContractChangePlan rawContractChangePlan = new RawContractChangePlan();
        rawContractChangePlan.setActiveFlag("1");
        rawContractChangePlan.setContractChangePlanNo(rawContractChangePlanDto.getContractChangePlanNo());
        
        List<RawContractChangePlan> list = iMaterialHandInsideWhService.queryPlanList(rawContractChangePlan);
        if (list.size() > 0) {
//        	状态：0：创建 1：通过 2：驳回 3：扫码中 4：扫码完成 5：确认完成
            for (RawContractChangePlan tmp : list) {
                if ("0".equals(tmp.getStatus())) {
                	resp.setCode(Constant.FAIL);
                    resp.setMsg("该变更单未审核！");
                    return resp;
                }else if ("2".equals(tmp.getStatus())) {
                	resp.setCode(Constant.FAIL);
                    resp.setMsg("该变更单被驳回！");
                    return resp;
                }else if ("5".equals(tmp.getStatus())) {
                	resp.setCode(Constant.FAIL);
                    resp.setMsg("该变更单已经确认完成！");
                    return resp;
                }
            }
        } else {
            resp.setCode(Constant.FAIL);
            resp.setMsg("该变更单不存在！");
            return resp;
        }
        
        resp.setList(list);
        
        return resp;
    }

    /**
     * @Title: scanBarcode
     * @Description: 扫码
     * @date 2019年3月7日 上午10:59:51
     * @author luoteng
     * @param rawContractChangePlanDto
     * @return HandResp   
     */
    @PostMapping("scan")
    public HandResp scanBarcode(@RequestBody RawContractChangePlanDto rawContractChangePlanDto) {
    	HandResp resp = new HandResp();
    	resp.setCode(Constant.SUCCESS);
    	
		String key = Constant.RAW_HTJY_PREFIX + rawContractChangePlanDto.getBarcode();
		
		if(stringRedisTemplate.hasKey(key)){
			resp.setCode(Constant.FAIL);
			resp.setMsg("当前条码正在处理中，请不要重复扫描！");
			return resp;
		}else{
			stringRedisTemplate.opsForValue().set(key, "1", Constant.PRO_HAND_LOST_MINUTES, TimeUnit.MINUTES);//写入对象，并设置失效时间

			TransResult result = new TransResult();
			try{
				result = iMaterialHandInsideWhService.planScanBarcode(rawContractChangePlanDto);
				resp.setCode(result.getCode());
				resp.setMsg(result.getMsg());
				resp.setList(result.getList());
			}catch(RuntimeException e){
				resp.setCode(Constant.FAIL);
				resp.setMsg(e.getMessage());
				stringRedisTemplate.delete(key);//删除对象
			}
		}

		stringRedisTemplate.delete(key);//删除对象
		return resp;
    }
    
    /**
     * @Title: delBarcode
     * @Description: 退扫
     * @date 2019年3月7日 上午11:00:09
     * @author luoteng
     * @param rawContractChangePlanDto
     * @return HandResp   
     */
    @PostMapping("del")
    public HandResp delBarcode(@RequestBody RawContractChangePlanDto rawContractChangePlanDto) {
    	HandResp resp = new HandResp();
    	resp.setCode(Constant.SUCCESS);
    	
		String key = Constant.RAW_HTJY_PREFIX + rawContractChangePlanDto.getBarcode();
		
		if(stringRedisTemplate.hasKey(key)){
			resp.setCode(Constant.FAIL);
			resp.setMsg("当前条码正在处理中，请不要重复扫描！");
			return resp;
		}else{
			stringRedisTemplate.opsForValue().set(key, "1", Constant.PRO_HAND_LOST_MINUTES, TimeUnit.MINUTES);//写入对象，并设置失效时间
			
			TransResult result = new TransResult();
			try{
				result = iMaterialHandInsideWhService.planDelBarcode(rawContractChangePlanDto);
				resp.setCode(result.getCode());
		        resp.setMsg(result.getMsg());
		        resp.setList(result.getList());
			}catch(RuntimeException e){
				resp.setCode(Constant.FAIL);
				resp.setMsg(e.getMessage());
				stringRedisTemplate.delete(key);//删除对象
			}
		}
		
		stringRedisTemplate.delete(key);//删除对象
		return resp;
    }
    
    /**
     * @Title: confirm
     * @Description: 确认
     * @date 2019年3月7日 上午11:00:23
     * @author luoteng
     * @param rawContractChangePlanDto
     * @return HandResp   
     */
    @PostMapping("confirm")
    public HandResp confirm(@RequestBody RawContractChangePlanDto rawContractChangePlanDto) {
    	HandResp resp = new HandResp();
    	resp.setCode(Constant.SUCCESS);
    	
		String key = Constant.RAW_HTJY_PREFIX + rawContractChangePlanDto.getLoginName();

		if(stringRedisTemplate.hasKey(key)){
			resp.setCode(Constant.FAIL);
			resp.setMsg("请等" + Constant.PRO_HAND_LOST_MINUTES + "分钟再操作！");
			return resp;
		}else{
			stringRedisTemplate.opsForValue().set(key, "1", Constant.PRO_HAND_LOST_MINUTES, TimeUnit.MINUTES);//写入对象，并设置失效时间

			TransResult result = new TransResult();
			try{
				result = iMaterialHandInsideWhService.planComplete(rawContractChangePlanDto);
				resp.setCode(result.getCode());
				resp.setMsg(result.getMsg());
				resp.setList(result.getList());
			}catch(RuntimeException e){
				resp.setCode(Constant.FAIL);
				resp.setMsg(e.getMessage());
				stringRedisTemplate.delete(key);//删除对象
			}
		}

		stringRedisTemplate.delete(key);//删除对象
		return resp;
    }
}